package com.utils.ipv4;

public class ipv4AndInt {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(ipv4ToInt("255.255.255.255"));
        System.out.println(ipv4ToInt("255.255.255.254"));
        System.out.println(ipv4ToInt("1.1.1.1"));
        System.out.println(ipv4ToInt("0.0.0.0"));
        System.out.println(intToIpv4(1));
        System.out.println(intToIpv4(255));
        System.out.println(intToIpv4(256));
    }

    /**
     * 将IP地址（IPV4）字符串转换为 int类型的数字
     * <p>
     * 思路:将 IP地址（IPV4）的每一段数字转为 8 位二进制数，并将它们放在结果的适当位置上
     *
     * @param ipv4_string IP地址（IPV4） 字符串，如 127.0.0.1
     * @return IP地址（IPV4）  字符串对应的 int值
     */
    public static int ipv4ToInt(String ipv4_string) {
        // 取 ip 的各段
        String[] ipSlices = ipv4_string.split("\\.");

        int result = 0;

        for (int i = 0; i < ipSlices.length; i++) {
            // 将 ip 的每一段解析为 int，并根据位置左移 8 位
            int intSlice = Integer.parseInt(ipSlices[i]) << 8 * i;

            // 求或
            result = result | intSlice;
        }

        return result;
    }

    /**
     * 将 int类型的数字转换为IP地址（IPV4）字符串
     *
     * @param ipv4_int 用 int表示的IP地址（IPV4）字符串
     * @return IP地址（IPV4）字符串，如 127.0.0.1
     */
    public static String intToIpv4(int ipv4_int) {
        String[] ipString = new String[4];

        for (int i = 0; i < 4; i++) {
            // 每 8 位为一段，这里取当前要处理的最高位的位置
            int pos = i * 8;

            // 取当前处理的 ip 段的值
            int and = ipv4_int & (255 << pos);

            // 将当前 ip 段转换为 0 ~ 255 的数字，注意这里必须使用无符号右移
            ipString[i] = String.valueOf(and >>> pos);
        }

        return String.join(".", ipString);
    }


}
